// 给定一个整数数组和一个整数 k，你需要找到该数组中和为 k 的连续的子数组的个数。

// 示例 1 :

// 输入:nums = [1,1,1], k = 2
// 输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。

// 来源：力扣（LeetCode）
// 链接：https://leetcode-cn.com/problems/subarray-sum-equals-k
// 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

#include<bits/stdc++.h>
#include<string>
#include<vector>
#include<unordered_set>
#include<unordered_map>
#include<set>
#include<queue>
#include<stack>
using namespace std;

// 前缀和，能硬推但是具体原理不明白
// 执行用时：
// 64 ms
// , 在所有 C++ 提交中击败了
// 91.91%
// 的用户
// 内存消耗：
// 35.1 MB
// , 在所有 C++ 提交中击败了
// 95.09%
// 的用户

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        unordered_map<int,int> hash;
        // 前缀和0默认为1
        hash[0] = 1;
        int sum =0;
        int res =0;
        for(int i=0;i<nums.size();i++){
            sum = sum + nums[i];
            if(hash.find(sum-k)!=hash.end()){
                res = res + hash[sum-k];
            }
            hash[sum]++;
        }
        return res;

    }
};